/*
  // 1. 初始化reducer
  // 1.1💥 不要解构action
  // 1.2. 给reducer加上返回值类型
  // 1.3. action提前定义类型
*/

/*
 *   存储 token 到 redux 的实现思路
 *      1. 实现一个 Reducer ，用于在Redux 中操作 token 状态
 *      2. 实现一个 Action ， 在该 Action 中调用 Reducer 来保存 Token 状态
 *      3. 在上一章节获取 token 的 Action 中，调用上面的 Action 来保存从后端刚获取到的token
 */

import { getTokenInfo } from '@/utils/storage';

export type Auth = {
  token: string;
  refresh_token: string;
};

// 个人信息
export type User = {
  id: string;
  name: string;
  photo: string;
  art_count: number;
  follow_count: number;
  fans_count: number;
  like_count: number;
};

// 用户资料
export type ProfileType = {
  id: string;
  photo: string;
  name: string;
  mobile: string;
  gender: number;
  birthday: string;
  // 后台没有，自己补上
  intro: string;
};

const initialState = {
  profile: {} as ProfileType,
  // 个人信息
  user: {} as User,
  // 从缓存中获取token数据，避免刷新后redux就没数据了
  auth: getTokenInfo(),
};

// 定义一个action 类型
type UserAction =
  | { type: 'user/saveAuth'; payload: Auth }
  | { type: 'user/saveUser'; payload: User }
  | { type: 'user/saveProfile'; payload: ProfileType }
  // Partial 是可选属性
  | { type: 'user/updataProfile'; payload: Partial<ProfileType> };

export default function userReducer(
  state = initialState,
  action: UserAction
): typeof initialState {
  switch (action.type) {
    // 存储token
    case 'user/saveAuth':
      return { ...state, auth: action.payload };
    // 个人信息
    case 'user/saveUser':
      return { ...state, user: action.payload };
    // 个人资料
    case 'user/saveProfile':
      return { ...state, profile: action.payload };
    // 编辑信息
    case 'user/updataProfile':
      return {
        ...state,
        profile: {
          ...state.profile,
          ...action.payload,
        },
      };
    default:
      return state;
  }
}
